Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Commit 121f9e79e8ef12cb4ad18883cb0810bd8f1ccaee


Parents : 1e05409
Author : Mark Qvist <mark@unsigned.io>
Date : 2025-11-19T14:40:34+01:00

Added support for handling noise floor calculations on devices with LNA gain variance during LNA recalibration. Fixed potential incoming packet buffer corruption on split packet reception at high bitrates.

Changes

5 files changed, 25 insertions(+), 12 deletions(-)

M Boards.h +1
M Config.h +4
M Makefile +2 -2

Diff

diff --git a/Boards.h b/Boards.h
index 1528345..eaee2d5 100644
--- a/Boards.h
+++ b/Boards.h
@@ -419,6 +419,7 @@
#define DIO2_AS_RF_SWITCH true
#define LORA_LNA_GAIN 17
+ #define LORA_LNA_GVT 12
#define LORA_PA_GC1109 true
#define LORA_PA_PWR_EN 7
#define LORA_PA_CSD 2

diff --git a/Config.h b/Config.h
index 123c6d6..29e1f4f 100644
--- a/Config.h
+++ b/Config.h
@@ -86,6 +86,8 @@
#define LORA_PREAMBLE_FAST_DELTA 18
#define LORA_FAST_THRESHOLD_BPS 30E3
#define LORA_LIMIT_THRESHOLD_BPS 60E3
+ #define LORA_GUARD_THRESHOLD_BPS 14E3
+ #define LORA_FAST_GUARD_MS 48
long lora_preamble_symbols = LORA_PREAMBLE_SYMBOLS_MIN;
long lora_preamble_time_ms = 0;
long lora_header_time_ms = 0;
@@ -94,6 +96,7 @@
float lora_us_per_byte = 0.0;
bool lora_low_datarate = false;
bool lora_limit_rate = false;
+ bool lora_guard_rate = false;
// CSMA Parameters
#define CSMA_SIFS_MS 0
@@ -154,6 +157,7 @@
uint8_t last_snr_raw = 0x80;
uint8_t seq = 0xFF;
uint16_t read_len = 0;
+ uint16_t host_write_len = 0;
// Incoming packet buffer
uint8_t pbuf[MTU];

diff --git a/Makefile b/Makefile
index 758f664..a1207bc 100644
--- a/Makefile
+++ b/Makefile
@@ -211,8 +211,8 @@ upload-heltec32_v4:
arduino-cli upload -p /dev/ttyACM0 --fqbn esp32:esp32:esp32s3
@sleep 1
rnodeconf /dev/ttyACM0 --firmware-hash $$(./partition_hashes ./build/esp32.esp32.esp32s3/RNode_Firmware.ino.bin)
- @sleep 3
- python ./Release/esptool/esptool.py --chip esp32-s3 --port /dev/ttyACM0 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size 4MB 0x210000 ./Release/console_image.bin
+ #@sleep 3
+ #python ./Release/esptool/esptool.py --chip esp32-s3 --port /dev/ttyACM0 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size 4MB 0x210000 ./Release/console_image.bin
upload-tdeck:
arduino-cli upload -p /dev/ttyACM0 --fqbn esp32:esp32:esp32s3

diff --git a/RNode_Firmware.ino b/RNode_Firmware.ino
index 1984c9b..111f171 100644
--- a/RNode_Firmware.ino
+++ b/RNode_Firmware.ino
@@ -42,7 +42,7 @@ volatile bool serial_buffering = false;
#endif
#if PLATFORM == PLATFORM_ESP32 || PLATFORM == PLATFORM_NRF52
- #define MODEM_QUEUE_SIZE 4
+ #define MODEM_QUEUE_SIZE 8
typedef struct {
size_t len;
int rssi;
@@ -314,7 +314,7 @@ inline void kiss_write_packet() {
serial_write(FEND);
serial_write(CMD_DATA);
- for (uint16_t i = 0; i < read_len; i++) {
+ for (uint16_t i = 0; i < host_write_len; i++) {
#if MCU_VARIANT == MCU_NRF52
portENTER_CRITICAL();
uint8_t byte = pbuf[i];
@@ -329,7 +329,7 @@ inline void kiss_write_packet() {
}
serial_write(FEND);
- read_len = 0;
+ host_write_len = 0;
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
packet_ready = false;
@@ -455,7 +455,8 @@ void ISR_VECT receive_callback(int packet_size) {
kiss_indicate_stat_snr();
// And then write the entire packet
- kiss_write_packet();
+ host_write_len = read_len;
+ kiss_write_packet(); read_len = 0;
#else
// Allocate packet struct, but abort if there
@@ -473,7 +474,7 @@ void ISR_VECT receive_callback(int packet_size) {
// allocated memory again if the queue is
// unable to receive the packet.
modem_packet->len = read_len;
- memcpy(modem_packet->data, pbuf, read_len);
+ memcpy(modem_packet->data, pbuf, read_len); read_len = 0;
if (!modem_packet_queue || xQueueSendFromISR(modem_packet_queue, &modem_packet, NULL) != pdPASS) {
free(modem_packet);
}
@@ -1359,6 +1360,11 @@ void update_noise_floor() {
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
if (!dcd) {
if (!noise_floor_sampled || current_rssi < noise_floor + CSMA_INFR_THRESHOLD_DB) {
+ #if HAS_LORA_LNA
+ // Discard invalid samples due to gain variance
+ // during LoRa LNA re-calibration
+ if (current_rssi < noise_floor-LORA_LNA_GVT) { return; }
+ #endif
noise_floor_buffer[noise_floor_sample] = current_rssi;
noise_floor_sample = noise_floor_sample+1;
if (noise_floor_sample >= NOISE_FLOOR_SAMPLES) {
@@ -1612,7 +1618,8 @@ void tx_queue_handler() {
cw_wait_passed += millis()-cw_wait_start; cw_wait_start = millis();
if (cw_wait_passed < cw_wait_target) { return; } // Contention window wait time has not yet passed, continue waiting
else { // Wait time has passed, flush the queue
- if (!lora_limit_rate) { flush_queue(); } else { pop_queue(); }
+ bool should_flush = !lora_limit_rate && !lora_guard_rate;
+ if (should_flush) { flush_queue(); } else { pop_queue(); }
cw_wait_passed = 0; csma_cw = -1; difs_wait_start = -1; }
}
}
@@ -1628,9 +1635,9 @@ void loop() {
#if MCU_VARIANT == MCU_ESP32
modem_packet_t *modem_packet = NULL;
if(modem_packet_queue && xQueueReceive(modem_packet_queue, &modem_packet, 0) == pdTRUE && modem_packet) {
- read_len = modem_packet->len;
- last_rssi = modem_packet->rssi;
- last_snr_raw = modem_packet->snr_raw;
+ host_write_len = modem_packet->len;
+ last_rssi = modem_packet->rssi;
+ last_snr_raw = modem_packet->snr_raw;
memcpy(&pbuf, modem_packet->data, modem_packet->len);
free(modem_packet);
modem_packet = NULL;
@@ -1648,7 +1655,7 @@ void loop() {
modem_packet_t *modem_packet = NULL;
if(modem_packet_queue && xQueueReceive(modem_packet_queue, &modem_packet, 0) == pdTRUE && modem_packet) {
memcpy(&pbuf, modem_packet->data, modem_packet->len);
- read_len = modem_packet->len;
+ host_write_len = modem_packet->len;
free(modem_packet);
modem_packet = NULL;

diff --git a/Utilities.h b/Utilities.h
index 9f1575e..8892f59 100644
--- a/Utilities.h
+++ b/Utilities.h
@@ -1239,6 +1239,7 @@ void updateBitrate() {
bool fast_rate = lora_bitrate > LORA_FAST_THRESHOLD_BPS;
lora_limit_rate = lora_bitrate > LORA_LIMIT_THRESHOLD_BPS;
+ lora_guard_rate = (!lora_limit_rate && lora_bitrate > LORA_GUARD_THRESHOLD_BPS);
int csma_slot_min_ms = CSMA_SLOT_MIN_MS;
float lora_preamble_target_ms = LORA_PREAMBLE_TARGET_MS;


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────